package Funcionalidade;

import java.util.HashMap;

import ElementosLogicos.Estado;
import Modelo.AutomatoFinito;
import Modelo.GramaticaRegular;

public class GR2AF {
	
	private Estado[] estado;
	private HashMap<Character,Estado> simboloProd;
	
	public AutomatoFinito converte(GramaticaRegular gr){
		AutomatoFinito af = new AutomatoFinito(gr.getAlfabeto());
		int numEstados = gr.getNumeroProducoes() + 1;
		estado = new Estado[numEstados];
		criaEstado(gr);
		for (int i = 0; i < numEstados - 1; i++) {
			String[] transicoes = separaTrans(gr.getProducao(i));
			int numTransicoes = transicoes.length;
			for (int j = 0; j < numTransicoes; j++) {
				char terminal = transicoes[j].charAt(0);
				if (transicoes[j].length() == 2) {
					estado[i].geraTransicao(terminal,
							simboloProd.get(transicoes[j].charAt(1)));
				} else {
					if(estado[i].entradaReconhecida(terminal)){
						for(Estado e : estado[i].transicao(terminal)){
							e.setFinal(true);
						}
					}else
						estado[i].geraTransicao(terminal,
								estado[numEstados-1]);
					af.addEstado(estado[numEstados-1]);
				}
			}
			af.addEstado(estado[i]);
		}
		return af;
	}
	
	public void criaEstado(GramaticaRegular gr){
		int i;
		for(i=0; i<estado.length-1; i++){
			String nome = "q" + i;
			//System.err.println("nome: "+nome);
			estado[i] = new Estado(nome);
			
			System.err.println("iteracao: "+i);
			System.err.print("estado: "+estado[i].getNome());
			System.err.println(" = "+gr.getProducao(i).charAt(0));
			System.err.println("estado.length: "+estado.length);

			System.err.println("charProd: "+gr.getProducao(i).charAt(0));
			System.err.println("estado.toString: "+estado[i].toString());
			simboloProd.put(gr.getProducao(i).charAt(0), estado[i]);
		}
		System.err.println("aqui");
		estado[estado.length-1] = new Estado("q"+i); // estado final
	}
	
	public String[] separaTrans(String prod){
		return prod.substring(3).split("\\|");
	}
}
